package org.zs.javaConfig3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.zs.ioc3.UserDao;
import org.zs.ioc3.UserService;

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JavaConfig {
    //    @Value("jdbc.url")
//    private String url ;
/*
@Bean ->返回值 ->ioc容器中
细节1： 组件的名称  默认 方法名    修改 1 改方法名   2 @Bean(name|value)
细节2： 如何设置周期方法：1 接口 2 注解 3 xml init-method destroy-method 4 @Bean(initMethod|destroyMethod)
细节3：如何设置单利还是多例
细节4： 如何设置非引用类型的值（外部的配置参数）
    1 配置类中声明变量 + @Value注解
    2 在@baen的形参列表中引入(@Value("${jdbc.url}") String url)  [推荐]
细节5 如何设置医用类型值
    @Bean 方法的形参列表（其他组件类型 对象名） ->  核心容器会自动按照类型注入 （@Autowired）
    1 没有类型 报错 NoSuchBeanDefinitionException
    2 如果有，且存在多个类型，现根据形参名进行匹配，匹配不到报错
* */
    @Scope(value = "singleton")
    @Bean(name = "userDao1", initMethod = "start", destroyMethod = "end")
    public UserDao userDao(@Value("${jdbc.url}")String url){
        UserDao userDao = new UserDao();
        userDao.setUrl(url);
        return userDao;
    }
    @Bean
    public UserService userService(UserDao userDao){
        UserService userService = new UserService();
        userService.setUserDao(userDao);
        return userService;
    }
}

